package main

import "fmt"

// 避免语意不明
// Naked Parameter 指的应该是意义不明确的参数，这种情况会破坏代码的可读性，可以使用 C 分格的注释（/*...*/）进行注释。

func printInfo(name string, isLocal, done bool) {

}

type T struct {
	Name string
}

func main() {
	printInfo("foo", true /* isLocal */, true /* done */)
	// Go 支持使用反引号，也就是 “`” 来表示原生字符串，在需要转义的场景下，我们应该尽量使用这种方案来替换。
	// bad
	wantError := "unknown name:\"\test\""
	// good
	wantError2 := `unknown err: "test"`
	fmt.Println(wantError, wantError2)
	// Struct 引用初始化
	// 使用 &T{} 而不是 new(T) 来声明对 T 类型的引用，使用 &T{} 的方式我们可以和 struct 声明方式 T{} 保持统一。
	// Bad
	sptr := new(T)
	sptr.Name = "bar"
	// Good
	sptr2 := &T{Name: "foo"}
	fmt.Println(sptr, sptr2)
	// 如果我们要在 Printf 外面声明 format 字符串的话，使用 const，而不是变量，这样 go vet 可以对 format 字符串做静态分析。
	// Bad
	msg := "unexpected values %v,%v \n"
	fmt.Printf(msg, 1, 2)
	// Good
	const msg2 = "unexpected values %v,%v \n"
	fmt.Printf(msg2, 1, 2)

}
